#include <iostream>
#include <vector>

using namespace std;

struct SkiplistNode
{
    int _val;
    vector<SkiplistNode *> _nextV;
    SkiplistNode(int val, int level)
        : _val(val), _nextV(level, nullptr)
    {
    }
};
class Skiplist
{
    typedef SkiplistNode Node;

public:
    Skiplist()
    {
        srand(time(nullptr));
        // 头结点,层数是1
        _head = new SkiplistNode(-1, 1);
    }

    bool search(int target)
    {
        Node *cur = _head;
        int level = _head->_nextV.size() - 1;
        while (level >= 0)
        {
            // 目标值比下一个值要大,向右走
            // 下一个是空或者目标值比下一个值要小，向下走
            if (cur->_nextV[level] && cur->_nextV[level]->_val < target)
            {
                // 向右走
                cur = cur->_nextV[level];
            }
            else if (cur->_nextV[level] == nullptr || cur->_nextV[level]->_val > target)
            {
                // 向下走
                --level;
            }
            else
            {
                return true;
            }
        }

        return false;
    }

    // 查找节点的前屈节点
    vector<Node *> FindPrevNode(int num)
    {
        vector<Node *> prevV(_maxLevel, _head);
        Node *cur = _head;
        int level = _head->_nextV.size() - 1;
        while (level >= 0)
        {
            // 目标值比下一个值要大,向右走
            // 下一个是空或者目标值比下一个值要小，向下走
            if (cur->_nextV[level] && cur->_nextV[level]->_val < num)
            {
                // 向右走
                cur = cur->_nextV[level];
            }
            else if (cur->_nextV[level] == nullptr || cur->_nextV[level]->_val >= num)
            {
                // 更新level层的前一个
                prevV[level] = cur;
                // 向下走
                --level;
            }
        }

        return prevV;
    }

    void add(int num)
    {
        vector<Node *> prevV = FindPrevNode(num);
        int n = RandomLevel();
        Node *newnode = new Node(num, n);
        // 如果n超过了当前的最大层数,那么就升高一下_head
        if (n > _head->_nextV.size())
            _head->_nextV.resize(n);
        // 链接前后节点
        for (int i = 0; i < n; i++)
        {
            newnode->_nextV[i] = prevV[i]->_nextV[i];
            prevV[i]->_nextV[i] = newnode;
        }
    }

    bool erase(int num)
    {
        vector<Node *> prevV = FindPrevNode(num);
        // 第一层下一个不是val
        if (prevV[0]->_nextV[0] == nullptr || prevV[0]->_nextV[0]->_val != num)
        {
            return false;
        }
        Node *del = prevV[0]->_nextV[0];
        // del节点每一层的前后指针连接起来
        for (int i = 0; i < del->_nextV.size(); i++)
        {
            prevV[i]->_nextV[i] = del->_nextV[i];
        }
        delete del;
        return true;
    }

    int RandomLevel()
    {
        size_t level = 1;
        // rand() -> [0,RAND_MAX]
        while (rand() < RAND_MAX * _p && level < _maxLevel)
        {
            ++level;
        }
        return level;
    }

private:
    Node *_head;
    size_t _maxLevel = 32;
    double _p = 0.25;
};
